package br.com.virtual.cadastrar.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.NoResultException;

import br.com.virtual.base.dao.impl.BaseDaoImpl;
import br.com.virtual.cadastrar.dao.UsuarioDAO;
import br.com.virtual.cadastrar.model.Usuario;

public class UsuarioDAOImpl extends BaseDaoImpl implements UsuarioDAO {

	@Override
	public Usuario create(Usuario usuario) {

		getManager().persist(usuario);
		return usuario;
	}

	@Override
	public Usuario read(Long id) {
		return getManager().find(Usuario.class, id);
	}

	@Override
	public Usuario update(Usuario usuario) {
		usuario = getManager().merge(usuario);
		return usuario;
	}

	@Override
	public void delete(Usuario usuario) {
		getManager().remove(read(usuario.getId()));
	}

	@Override
	public List<Usuario> getList() {
		return this.list("");
	}

	@Override
	public List<Usuario> getListAtivo() {
		return this.list(" where c.ativo = true ");
	}

	private List<Usuario> list(String where) {
		return new ArrayList<Usuario>(getManager().createQuery(
				"from Usuario c " + where, Usuario.class).getResultList());
	}

	@Override
	public Usuario read(String email) {

		Usuario usr = null;

		try {

			usr = getManager()
					.createQuery(
							"select u from Usuario u" + " left join u.pessoa p"
									+ " where p.email = :email", Usuario.class)
					.setParameter("email", email).getSingleResult();

		} catch (NoResultException ex) {
			return null;
		}

		return usr;
	}
}
